#include<bits/stdc++.h>
#define sd(n) scanf("%d",&n) 
#define sld(n) scanf("%lld",&n)
#define pd(n) printf("%d", (n))
#define pld(n) printf("%lld", n)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define fi first
#define se second
const int N=2e5;
const int maxn=1e6;
typedef long long int ll;
using namespace std;
//----------------------------------------------------------------------------//
int a[505][505];
void solve()
{
	int n,k,r,c;//n是k的倍数,在n*n的矩阵中补充.和X使得任意的1*k或k*1的子矩阵至少有1个x
	sd(n);sd(k);sd(r);sd(c);//用最少的x,并且(r,c)位置一定要有X

	for(int i=1;i<=n;i++)//把n*n分成k*k个小矩阵,n是k的倍数,k*k无需重叠
	{//第一思路是让r,c为x的那个不重叠矩阵沿着r,c的对角线全为x,然后向左右平移,再向y复制这个矩阵
		for(int j=1;j<=n;j++)//满足一个条件,只要在同一对角线的话x+y是不变的,左移和右移只需要判断一下就好
		{
			if(abs(i+j-r-c)%k==0)//这个公式是让左移或者右移的数模拟变大r,c这个点存在的k*k的子矩阵中,并且判断是否在同一对角线
				cout<<'X';
			else
				cout<<'.';
		}
		puts("");
	}

	//int dif=abs(r%k-c%k)//变到第一个子k*k矩阵中
	//每个点int t=abs(i%k-j%k)//副对角线abs(x-y)相同



}

int main()
{
	int T;
	sd(T);
	while (T--)
	{
		solve();
	}
	return 0;
}